#ifndef CONNECTIONPOOL_H
#define CONNECTIONPOOL_H

#include"Connection.h"
#include<memory>
#include<queue>
#include<atomic>
#include<mutex>
#include<condition_variable>

// 线程安全的单例模式

class ConnectionPool;

class ConnectionPool
{
public:
	// 单例生成
	static ConnectionPool* getConnectionPool();

	// 返回一个链接  需要重载他的删除器 因为默认的是调用其析构结束链接， 但是需要的是要将连接返回连接池
	// 智能指针默认是直接delete掉， 重载删除器
	shared_ptr<Connection> getConnection();
private:
	// 构造私有化
	ConnectionPool();

	// 从配置文件中加载数据
	bool loadConfigFile();

	// 再生产者线程中负责生产链接
	void produceConnectionTask();

	// 扫描超过MaxIDleTime时间的空闲连接
	void scannerConnectionTask();

	string _ip; // ip地址
	unsigned short _port;	//端口
	string _username;
	string _password;
	int _initSize;
	int _maxSize;
	int _maxIdleTime;	//线程池最大空闲时间
	int _connectionTimeout;	//连接池获取链接的超时时间
	string _dbname;	// 数据库名称

	queue<Connection*> _connectionQue;
	atomic_int _connectionCnt;//记录创建connection链接总数量
	mutex _queueMutex;

	condition_variable cv; //链接生产和消费的通信

};

#endif